package util

import (
	"errors"
	"github.com/golang-jwt/jwt/v5"
	"github.com/spf13/viper"
	"time"
)

/**
 * @Description 生成 jwtToken
 * @Date 2023/5/15 周一 19:42
 * @Author Tang-J-L <vx：17685112557>
 */

type IJwtToken struct {
	ID   int
	Name string
	jwt.RegisteredClaims
}

var signingKey = []byte(viper.GetString("jwt.signingKey"))

// GetToken 生成token
func GetToken(id int, name string) (string, error) {

	jwtClaims := IJwtToken{
		ID:   id,
		Name: name,
		RegisteredClaims: jwt.RegisteredClaims{
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(2 * time.Hour)), // token 过期时间，2小时
			IssuedAt:  jwt.NewNumericDate(time.Now()),                    // token 签发时间
			Subject:   "jwtToken",                                        // 主题
		},
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwtClaims)

	return token.SignedString(signingKey)
}

// ParseToken 解析token
func ParseToken(tokenStr string) (IJwtToken, error) {
	var jwtClaims IJwtToken
	token, err := jwt.ParseWithClaims(tokenStr, &jwtClaims, func(token *jwt.Token) (any, error) {
		return signingKey, nil
	})
	if err == nil && !token.Valid {
		err = errors.New("无效的token！")
	}

	return jwtClaims, err
}

// ValidToken 验证token是否有效
func ValidToken(tokenStr string) bool {
	_, err := ParseToken(tokenStr)
	if err != nil {
		return false // token 无效
	}
	return true // token 有效
}
